package com.yunke.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yunke.dto.YunkeCreateRechargeDto;
import com.yunke.dto.YunkeWithdrawalDto;
import com.yunke.entity.YunkeAmountLog;
import com.yunke.entity.YunkeRechargeOrder;
import com.yunke.entity.YunkeWithdrawal;
import com.yunke.vo.YunkeBalanceVo;
import com.yunke.vo.YunkeRechargeConfigVo;

import java.math.BigDecimal;
import java.util.Map;

/**
 * 支付系统Service接口
 * 
 * @author yunke
 * @since 1.0.0
 */
public interface YunkePayService {

    /**
     * 获取充值配置
     * 
     * @return 充值配置信息
     */
    YunkeRechargeConfigVo getRechargeConfig();

    /**
     * 创建充值订单
     * 
     * @param dto 充值订单信息
     * @return 充值订单
     */
    YunkeRechargeOrder createRechargeOrder(YunkeCreateRechargeDto dto);

    /**
     * 查询充值状态
     * 
     * @param orderNo 订单号
     * @return 订单状态信息
     */
    Map<String, Object> getRechargeStatus(String orderNo);

    /**
     * 获取用户余额信息
     * 
     * @param userId 用户ID
     * @return 余额信息
     */
    YunkeBalanceVo getUserBalance(Long userId);

    /**
     * 获取资金流水
     * 
     * @param userId 用户ID
     * @param type 交易类型
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 资金流水分页列表
     */
    IPage<YunkeAmountLog> getAmountLog(Long userId, Integer type, Integer pageNum, Integer pageSize);

    /**
     * 申请提现
     * 
     * @param dto 提现申请信息
     * @return 提现申请
     */
    YunkeWithdrawal applyWithdrawal(YunkeWithdrawalDto dto);

    /**
     * 获取提现记录
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 提现记录分页列表
     */
    IPage<YunkeWithdrawal> getWithdrawalList(Long userId, Integer pageNum, Integer pageSize);

    /**
     * 余额支付
     * 
     * @param userId 用户ID
     * @param amount 支付金额
     * @param orderNo 订单号
     * @param payPassword 支付密码
     * @param title 支付标题
     * @param description 支付描述
     * @return 支付结果
     */
    boolean balancePay(Long userId, BigDecimal amount, String orderNo, String payPassword, 
                       String title, String description);

    /**
     * 设置支付密码
     * 
     * @param userId 用户ID
     * @param payPassword 支付密码
     * @param smsCode 短信验证码
     * @return 设置结果
     */
    boolean setPayPassword(Long userId, String payPassword, String smsCode);

    /**
     * 修改支付密码
     * 
     * @param userId 用户ID
     * @param oldPayPassword 旧支付密码
     * @param newPayPassword 新支付密码
     * @return 修改结果
     */
    boolean changePayPassword(Long userId, String oldPayPassword, String newPayPassword);

    /**
     * 收支统计
     * 
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计数据
     */
    Map<String, Object> getPaymentStatistics(Long userId, Long startTime, Long endTime);

    /**
     * 微信支付回调处理
     * 
     * @param notifyData 回调数据
     * @return 处理结果
     */
    String handleWechatCallback(String notifyData);

    /**
     * 支付宝支付回调处理
     * 
     * @param notifyData 回调数据
     * @return 处理结果
     */
    String handleAlipayCallback(Map<String, String> notifyData);

    /**
     * 验证支付密码
     * 
     * @param userId 用户ID
     * @param payPassword 支付密码
     * @return 验证结果
     */
    boolean verifyPayPassword(Long userId, String payPassword);

    /**
     * 增加用户余额
     * 
     * @param userId 用户ID
     * @param amount 金额
     * @param type 交易类型
     * @param orderNo 订单号
     * @param title 标题
     * @param description 描述
     * @return 操作结果
     */
    boolean addUserBalance(Long userId, BigDecimal amount, Integer type, String orderNo, 
                          String title, String description);

    /**
     * 扣减用户余额
     * 
     * @param userId 用户ID
     * @param amount 金额
     * @param type 交易类型
     * @param orderNo 订单号
     * @param title 标题
     * @param description 描述
     * @return 操作结果
     */
    boolean deductUserBalance(Long userId, BigDecimal amount, Integer type, String orderNo, 
                             String title, String description);
} 